package com.zecan.blog.service.impl;

import com.zecan.blog.common.status.StarGoodStatus;
import com.zecan.blog.controller.exception.BlogException;
import com.zecan.blog.controller.exception.StarGoodException;
import com.zecan.blog.dao.StarGoodMapper;
import com.zecan.blog.entity.StarGood;
import com.zecan.blog.service.StarGoodService;
import com.zecan.blog.utils.RedisUtils;
import com.zecan.blog.utils.StringUtils;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * @ClassName StarGoodServiceImpl
 * @Description
 * @date 2022/11/16 12:08
 * @Version 1.0
 */
@Service
public class StarGoodServiceImpl implements StarGoodService {

    @Resource
    private StarGoodMapper starGoodMapper;

    @Resource
    private RedisUtils redisUtils;


    @Override
    public Boolean addGoodByUserIdAndArticleId(Integer userId, Integer articleId) throws SchedulerException {

        // 增加文章点赞数量的key
        String key = StringUtils.concatRedisGoodsKey();
        // 减少文章点赞数量的key
        String delKey = StringUtils.concatRedisDelGoodsKey();
        String hashKey = userId + "_" + articleId;


        // 查询当前数据表是否存在
        StarGood entity = starGoodMapper.findStarGoodByUserIdAndArticleId(articleId, userId);
        
        // 如果不存在当前entity 说明是第一次点赞
        if (entity == null) {
            StarGood build = StarGood.builder().isStar(0).isGood(1).updateTime(StringUtils.dateFormat(new Date())).userId(userId).articleId(articleId).build();
            starGoodMapper.insertStartGood(build);
            // 添加定时任务 redis添加缓存
            redisUtils.hashSet(key, hashKey, articleId + "_"+ build.getStarGoodId(), -1);
            return true;
        }
        // 保存对应的 文章ID 和 数据表id
        String value = articleId + "_" + entity.getStarGoodId();
        // 如果存在点赞信息则进行删除当前的点赞缓存 ==> 因为此时定时任务还没有更新
        if (!Objects.isNull(redisUtils.hashGet(key, hashKey))) {
            // 删除redis中对应的点赞信息  初始化数据库信息
            StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(0).isStar(-1).build();
            starGoodMapper.updateStarOrGoodStatus(build);
            redisUtils.delHash(key, hashKey);
            return false;
        } else if (entity.getIsGood() == 1) {
            //如果redis 不存在点赞缓存 , 且当前已经点赞过 ==> 说明定时任务已经更新 设置为初始状态为点赞
            StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(0).isStar(-1).build();
            starGoodMapper.updateStarOrGoodStatus(build);
            // 文章对应的点赞信息减少, 在redis中保存需要减少的文章
            redisUtils.hashSet(delKey, hashKey, value, -1);
            return false;
        } else {
            // 此时用户是有数据信息 且 没有点赞过 或者取消过点赞 ==> 收藏过也有信息, 设置已点赞1
            StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(1).isStar(-1).build();
            starGoodMapper.updateStarOrGoodStatus(build);
            redisUtils.hashSet(key, hashKey, value, -1);
            return true;
        }

    }


    @Override
    public Boolean addStarByUserIdAndArticleId(Integer userId, Integer articleId) {
        // 查看当前收藏点赞表是否存在
        StarGood entity = starGoodMapper.findStarGoodByUserIdAndArticleId(articleId, userId);
        // 如果不存在说明没有点赞收藏过, 则直接收藏该文章并返回
        if (entity == null) {
            StarGood build = StarGood.builder().isStar(1).isGood(0).updateTime(StringUtils.dateFormat(new Date())).userId(userId).articleId(articleId).build();
            starGoodMapper.insertStartGood(build);
            return true;
        }
        // 如果当前用户收藏过 则取消收藏
        if (entity.getIsStar() == 1) {
            StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(-1).isStar(0).updateTime(StringUtils.dateFormat(new Date())).build();
            starGoodMapper.updateStarOrGoodStatus(build);
            return false;
        }
        // 存在数据项 可能是收藏过 可能取消过收藏 ==> 点赞也存在信息
        // 修改为收藏
        StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(-1).isStar(1).updateTime(StringUtils.dateFormat(new Date())).build();
        starGoodMapper.updateStarOrGoodStatus(build);
        return true;
    }

    @Override
    public void unStarByUserIdAndArticleId(Integer userId, Integer articleId) {
        // 查看当前收藏点赞表是否存在
        StarGood entity = starGoodMapper.findStarGoodByUserIdAndArticleId(articleId, userId);
        if(entity ==null) {
            throw new StarGoodException(StarGoodStatus.USER_CANCEL_STAR_UNKNOWN_ERR);
        }
        // 取消收藏
        StarGood build = StarGood.builder().starGoodId(entity.getStarGoodId()).isGood(-1).isStar(0).updateTime(StringUtils.dateFormat(new Date())).build();
        Integer integer = starGoodMapper.updateStarOrGoodStatus(build);
        if(integer != 1) {
            throw new StarGoodException(StarGoodStatus.USER_CANCEL_STAR_UNKNOWN_ERR);
        }
    }
}
